// #include<iostream>
// #include<cstdbool>
// #include<sstream>//用于序列化和反序列化
// #include<string>
// #include<typeinfo>
// using namespace std;
// class Date
// {
// public:
//     Date(int year,int month,int day)
//         :_year(year)
//         ,_month(month)
//         ,_day(day)
//     {}
//     int _year;
//     int _month;
//     int _day;
// };
// ostream& operator<<(ostream& out,const Date& date)
// {
//     out<<date._year<<" "<<date._month <<" "<<date._day;
//     return out;
// }

// void test()
// {
//     // std::cout<<sizeof(bool)<<std::endl;
//     // std::cout<<sizeof(int)<<std::endl;

//     // std::string str();
//     // Date date1(2024,2,3),date2(2025,2,4);
//     // cout<<date1<<" | "<<date2<<endl;
// }
// void test1()
// {
//     int a = 10;
//     float b = 1;
//     void* any = &a;
//     cout<<any<<endl;
//     any = &b;
//     cout<<any<<endl;
//     *(float*)any = 1.2;
//     cout<<*(float*)any<<endl;

//     //什么样的指针类型，决定了什么样的对数据的运算方法
//     cout<<*(int*)any<<endl;
//     cout<<*(double*)any<<endl;
// }
// void test2()
// {
//     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//     cout<<"sizeof arr:"<<sizeof(arr)<<endl;
//     cout<<&arr<<endl;
//     cout<<&arr + 1<<endl;//地址的类型不同，运算方法不同
//     cout<<arr<<endl;        //首元素地址 + 1 -》跳过一个元素
//     cout<<arr + 1<<endl;    //数组地址 + 1 》 跳过整个数组
// }

// int func1(int a,float b,char c)
// {
//     cout<<"func1"<<endl;
//     return 1;
// }
// int func2(int a,float b,char c)
// {
//     cout<<"func2"<<endl;
//     return 2;
// }
// int func3(int a,float b,char c)
// {
//     cout<<"func3"<<endl;
//     return 3;
// }
// int func4(int a,float b,char c)
// {
//     cout<<"func4"<<endl;
//     return 4;
// }
// void test4()//函数指针数组
// {
//     int (*arrfunc[4])(int,float,char) = {func1,func2,func3,func4};
//     for(auto& func : arrfunc)
//     {
//         func(1,1.1,'a');
//         cout<<"______________________________"<<endl;
//     }
// }
// void test3()//数组指针和指针数组
// {
//     int arr[10] = {1,2,3,4,5,6,7,8,9,10};
//     int (*parr)[10] = &arr;
//     // cout<<&arr<<endl;
//     // cout<<parr<<endl;
//     cout<<typeid(&arr).name()<<endl;
//     cout<<typeid(parr).name()<<endl;



// }

// void test5()
// {
//     int a = 2;

//     // /*const*/ int const* pa = &a;
//     // int b = 10;
//     // int*const pa = &a;
//     // pa = &b;
//     // *pa = 20;
//     int* pa1 = &a;
// }
// void test6()
// {
//     char arr1[] = {'a', 'b', 'c','a','a'};
//     char arr2[] = "abc";
//     printf("%d\n", strlen(arr1));//未定义
//     printf("%d\n", strlen(arr2));//3
//     printf("%d\n", sizeof(arr1));//3
//     printf("%d\n", sizeof(arr2));//4
// }

// void test11()
// {
//     int a[] = {1,2,3,4};
//     printf("%d\n",sizeof(a));//16
//     printf("%d\n",sizeof(a+0));//4
//     printf("%d\n",sizeof(*a));//4
//     printf("%d\n",sizeof(a+1));//4
//     printf("%d\n",sizeof(a[1]));//4
//     printf("%d\n",sizeof(&a));//8
//     printf("%d\n",sizeof(*&a));//16
//     printf("%d\n",sizeof(&a+1));//8
//     printf("%d\n",sizeof(&a[0]));//8
//     printf("%d\n",sizeof(&a[0]+1));//4
// }
/*
16
8       printf("%d\n",sizeof(a+0));//4  ----------第一个元素的地址，是8
4
8       printf("%d\n",sizeof(a+1));//4   -------第二个元素的地址，是8
4
8
16
8
8
8       printf("%d\n",sizeof(&a[0]+1));//4 -------确实是8

6
8       printf("%d\n", sizeof(arr+0));//1 -------数组首元素地址，是8
1
1
8
8
8
*/
// void test22()
// {
//     char arr[] = {'a','b','c','d','e','f'};
//     printf("%d\n", sizeof(arr));//6
//     printf("%d\n", sizeof(arr+0));//1
//     printf("%d\n", sizeof(*arr));//1
//     printf("%d\n", sizeof(arr[1]));//1
//     printf("%d\n", sizeof(&arr));//8
//     printf("%d\n", sizeof(&arr+1));//8
//     printf("%d\n", sizeof(&arr[0]+1));//8
// }


// void test33()
// {
//     char arr[] = "abcdef";
//     printf("%d\n", sizeof(arr));//6
//     printf("%d\n", sizeof(arr+0));//8
//     printf("%d\n", sizeof(*arr));//1
//     printf("%d\n", sizeof(arr[1]));//1
//     printf("%d\n", sizeof(&arr));//8
//     printf("%d\n", sizeof(&arr+1));//8
//     printf("%d\n", sizeof(&arr[0]+1));//8
// }
/*
7   printf("%d\n", sizeof(arr));//6----------------------最后有一个\0
8
1
1
8
8
8


6
6
5
*/
// void test44()
// {
//     char arr[] = "abcdef";
//     printf("%d\n", strlen(arr));//6
//     printf("%d\n", strlen(arr+0));//6
//     //printf("%d\n", strlen(*arr));//未定义
//     //printf("%d\n", strlen(arr[1]));//未定义
//     // printf("%d\n", strlen(&arr));//6 ------------------未定义 char(*)[7] to const char* 
//     // printf("%d\n", strlen(&arr+1));//未定义 char(*)[7] to const char* 
//     printf("%d\n", strlen(&arr[0]+1));//5
// }

// void test55()
// {
//     char *p = "abcdef";
//     printf("%d\n", sizeof(p));//7
//     printf("%d\n", sizeof(p+1));//8
//     printf("%d\n", sizeof(*p));//1
//     printf("%d\n", sizeof(p[0]));//1
//     printf("%d\n", sizeof(&p));//8
//     printf("%d\n", sizeof(&p+1));//8
//     printf("%d\n", sizeof(&p[0]+1));//8
// }
/*
8       printf("%d\n", sizeof(p));//8 -------------这里的p代表的是一个指着变量
8
1
1
8
8
8


6
5
5
// */
// void test66()
// {
//     char *p = "abcdef";
//     printf("%d\n", strlen(p));//6
//     printf("%d\n", strlen(p+1));//5
//     // printf("%d\n", strlen(*p));//未定义
//     // printf("%d\n", strlen(p[0]));//未定义
//     // printf("%d\n", strlen(&p));//未定义
//     // printf("%d\n", strlen(&p+1));//未定义
//     printf("%d\n", strlen(&p[0]+1));//5
// }
/*
sizeof(数组名)，这⾥的数组名表⽰整个数组，计算的是整个数组的⼤⼩。 
2. &数组名，这⾥的数组名表⽰整个数组，取出的是整个数组的地址。 
3. 除此之外所有的数组名都表⽰⾸元素的地址
*/

// void test111()
// {
//     int a[3][4] = {0};
//     printf("%d\n",sizeof(a));//48
//     printf("%d\n",sizeof(a[0][0]));//4
//     printf("%d\n",sizeof(a[0]));//8
//     printf("%d\n",sizeof(a[0]+1));//8
//     printf("%d\n",sizeof(*(a[0]+1)));//4
//     printf("%d\n",sizeof(a+1));//16
//     printf("%d\n",sizeof(*(a+1)));//4
//     printf("%d\n",sizeof(&a[0]+1));//未定义
//     printf("%d\n",sizeof(*(&a[0]+1)));//16
//     printf("%d\n",sizeof(*a));//16
//     printf("%d\n",sizeof(a[3]));//越界
// }
/*
48
4
16      printf("%d\n",sizeof(a[0]));//8 ------------16
8
4
8       printf("%d\n",sizeof(a+1));//16 -----------------8
16      printf("%d\n",sizeof(*(a+1)));//4---------------16
8       printf("%d\n",sizeof(&a[0]+1));//未定义--------------------8
16
16
16      printf("%d\n",sizeof(a[3]));//越界---------------16
*/
// int main()
// {
//     // test11();
//     // test22();
//     // test33();
//     // test44();
//     // test55();
//     // test66();

//     test111();
//     return 0;
// }



#include<cstring>
#include<iostream>
#include<cassert>
using namespace std;
namespace ddsm
{
    void* memcpy(void* dest,const void* src,size_t size)
    {
        assert(dest);
        assert(src);

        void* ret = dest;//保存dest指针，便于返回
        while(size--)
        {
            *(char*)dest = *(char*)src;
            dest = (char*)dest + 1;
            src = (char*)src + 1;
        }
        return ret;
    }
    
    void* memmove(void* dest,const void* src,size_t size)
    {
        assert(dest);
        assert(src);
        void* ret = dest;
        if(dest <= src || (char*)dest >= (char*)src + size)
        {
            while(size--)
            {
                *(char*)dest = *(char*)src;
                dest = (char*)dest + 1;
                src = (char*)src + 1;
            }
        }
        else
        {
            dest = (char*)dest + size - 1;
            src = (char*)src + size - 1;
            while(size--)
            {
                *(char*)dest = *(char*)src;
                dest = (char*)dest - 1;
                src = (char*)src - 1;
            }
        }
        return ret;
    }

    char * strstr (const char * str1, const char * str2)
    {
        assert(str1);
        assert(str2);
        char *cp = (char *) str1;
        char *s1, *s2;
        if ( !*str2 )
            return((char *)str1);
        while (*cp)
        {
            s1 = cp;
            s2 = (char *) str2;
            while ( *s1 && *s2 && !(*s1-*s2) )
                s1++, s2++;
            if (!*s2)
                return(cp);
            cp++;
        } 
        return(NULL);
    }
    char *strstr(const char *str, const char *substr) {
        assert(str);
        assert(substr);
        if (!*substr) return (char *)str; // 空子字符串

        for (const char *cp = str; *cp; cp++) {
            const char *s1 = cp, *s2 = substr;
            while (*s1 && *s2 && *s1 == *s2) 
                s1++, s2++;
            if (!*s2) return (char *)cp;
        }
        return NULL;
    }
    char* strstr(const char* str,const char* substr)
    {
        assert(str);
        assert(substr);
        if(!*substr)
            return (char*)str;
        for(const char* cp = str;*cp;++cp){
            const char* s1 = cp,*s2 = substr;
            while(*s1 && *s2 && (*s1 == *s2)){
                s1++;
                s2++;
            }
            if(!*s2)
                return (char*)cp;
        }
        return NULL;
    }
};

int main()
{
    // char buf[100] = {0};
    // const char* str = "hello bit ddsm!\0dddd";
    // ddsm::memcpy(buf,str,strlen(str));
    // cout<<"buf:"<<buf<<endl;

    char* ret = ddsm::strstr("abcdef","bc");
    cout<<ret<<endl;
    return 0;
}

